/* Copyright (C) 2016-2017 HangZhou Zenzet Technology Co., Ltd.
 * All right reserved

 * File:lktsqlparser.h
 * Author:guojianchuan
 * Date:2017-05-19

 */

#ifndef LKT_SQLPARSER_H
#define LKT_SQLPARSER_H

#ifdef __cplusplus
extern "C" {
#endif

/* Declare : Macro/Struct/Enum/Union/Function */
#define SQL_PARSE_STATEMENT_MAX                 1   /* 最多一次性分析SQL语句 */
#define SQL_PARSE_TABLE_MAX                     64   

typedef enum tagMatchType
{
    LIKE = 1,
    OTHERS = 2, /* rlike, regexp*/
    MATCH_INVALID
}SQLPARSER_MATCH_TYPE_E;

typedef struct tagMatchPattern
{
    /* 匹配类型 */
    SQLPARSER_MATCH_TYPE_E matchType;

    /* 是否有NOT前缀, 比如Not like*/
    int isHaveNotToken;

    /* 转义字符 */
    /* 
     * 比如:
     * select * from mytable where name = '|%LOCKet%' escape '|' 
     * 这时候转义字符'|'后面的第一个%不代表通配符，而是表示实际的'%'符号
     * 
     * */
    int isHaveEscapeChar;
    char escapeChar;
}SQLPARSER_MATCH_PATTERN_S;

typedef struct tagPossbleTableNode
{
    char *tableName;
    char *dbName;
}SQLPARSER_POSSBILE_TABLE_NODE_S;

typedef struct tagPossibleTable
{
    int tableNum;
    SQLPARSER_POSSBILE_TABLE_NODE_S tableNode[SQL_PARSE_TABLE_MAX];
}SQLPARSER_POSSIBLE_TABLE_S;

typedef enum tagStatementType
{
    state_select = 0,
    state_insert,
    state_replace, 
    state_update,
    state_delete,
    state_invalid
}STATEMENT_TYPE_E;

/**
* @struct: SQLPARSER_COLUMN_NODE_S 
* @Author: guojianchuan
* @Date: 2017-05-19
* @Description: 解析出来的column字段
*/
typedef struct tagColumnNode
{
    /* char nchar varchar nvarchar 类型字段的值 */
    char *value;

    /* value对应的字段 */
    char *column;

    /* 如果字段对应的table是明确的,这个值不为NULL */
    char *prefixTable;

    /* 有些情况无法确定字段属于哪个table, 需要把所有可能的table都加上 */
    SQLPARSER_POSSIBLE_TABLE_S possbileTable;
    
    /* 对应的数据库 */
    char *prefixDatabase;

    /* value值在整个sql语句中的偏移 */
    int offset;

    /* value字段的长度 */
    int len;

    /* value字段对应的column索引，用于insert语句省略column的时候 */
    int idx;

    /* 标识是否是like或者rlike, regexp匹配  */
    int isMatchPattern;

    /* 匹配模式 */
    SQLPARSER_MATCH_PATTERN_S matchPattern;

    struct tagColumnNode *next;
}SQLPARSER_COLUMN_NODE_S;

/**
* @struct: SQLPARSER_STATEMENT_S 
* @Author: guojianchuan
* @Date: 2017-05-19
* @Description: SQL语句结构化表
*/
typedef struct tagSqlStatement
{
    int stmtType;
    char *originsql;
    int nodeNum;
    SQLPARSER_COLUMN_NODE_S *header;
}SQLPARSER_STATEMENT_S;

/**
* @struct: SQLPARSER_S 
* @Author: guojianchuan
* @Date: 2017-05-19
* @Description: SQL解析器
*/
typedef struct tagSQLParser
{
    int statementnum;
    SQLPARSER_STATEMENT_S *statement[SQL_PARSE_STATEMENT_MAX];
}SQLPARSER_S;

/**
* @struct: logger 
* @Author: guojianchuan
* @Date: 2017-05-19
* @Description: 日志接口
*/
typedef void (*logger)(const char*);

int LKT_SQLPARSER_ParseSQL(int dbverdor, const char *sqlquery, SQLPARSER_S *sqlpasrer, logger func);

void LKT_SQLPARSER_Release (SQLPARSER_S *sqlparser);

#ifdef __cplusplus

}
#endif
#endif



